<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>

<style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; --title-bar-height:20px; }
.mac-os-11 { --title-bar-height:28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  .typora-export #write { break-after: avoid; }
  .typora-export #write::after { height: 0px; }
  .is-mac table { break-inside: avoid; }
  .typora-export-show-outline .typora-export-sidebar { display: none; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-fences-math .MathJax_SVG_Display, .md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: visible; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
.md-expand mark .md-meta { opacity: 0.3 !important; }
mark .md-meta { color: rgb(0, 0, 0); }
@media print {
  .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-require-zoom-fix foreignobject { font-size: var(--mermaid-font-zoom); }
.md-fences.md-fences-math { font-size: 1em; }
.md-fences-math .MathJax_SVG_Display { margin-top: 8px; cursor: default; }
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
.md-fences-advanced:not(.md-focus) { background: inherit; }
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
.typora-export-show-outline #write { --webkit-flex:2; flex: 2 1 0%; }
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
@media screen and (max-width: 1024px) {
  .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
}
@media screen and (max-width: 800px) {
  .typora-export-sidebar { display: none; }
}
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
.outline-content strong { font-weight: 400; }
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
.outline-expander:hover::before { content: ""; }
.outline-h1 > .outline-item { padding-left: 0px; }
.outline-h2 > .outline-item { padding-left: 1em; }
.outline-h3 > .outline-item { padding-left: 2em; }
.outline-h4 > .outline-item { padding-left: 3em; }
.outline-h5 > .outline-item { padding-left: 4em; }
.outline-h6 > .outline-item { padding-left: 5em; }
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
.outline-label:hover { text-decoration: underline; }
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
.outline-children { display: none; }
.info-panel-tab-wrapper { display: none; }
.outline-item-open > .outline-children { display: block; }
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: "−"; }
.typora-export-collapse-outline .outline-children { display: none; }
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }


.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
@media print {
  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}


/* Fira Code */
/* 全局属性 */
:root{
  --select-text-bg-color: #e49123;
  --bg-color:  #fafafa;                   /*change background*/
  --text-color: #333333;                  /*change text color*/
  --md-char-color: #C7C5C5;               /*change color of meta characetrs like `*` in markdown */
  --meta-content-color: #5b808d;          /*change color of meta contents like image text or link address in markdown */

  --primary-color: #428bca;               /* color of primary buttons */
  --primary-btn-border-color: #285e8e;
  --primary-btn-text-color: #fff;

  --window-border: 1px solid #eee;        /*border for sidebar, etc*/

  --active-file-bg-color: #eee;           /*background color if list item in file tree or file list*/
  --active-file-text-color: inherit;
  --active-file-border-color: #777;

  --side-bar-bg-color: var(--bg-color);     /*change background of sidebar*/
  --item-hover-bg-color: rgba(229, 229, 229, 0.59); /*background of control items when hover, like menu in sidebar*/
  --item-hover-text-color: inherit;
  --monospace: monospace;                   /*monospace font for codes, fences*/
}
::selection {
	background:#b981d1;
	color:white
}
::-moz-selection {
	background:#b981d1;
	color:white
}
::-webkit-selection {
	background:#b981d1;
	color:white
}

#write {
  max-width: 914px;
  font-size: 16px;
  text-align: left;
  letter-spacing: 0px;
  font-family: "Fira Code", "微软雅黑","PingFang SC", "Microsoft YaHei", sans-serif;
}

/*段落*/
#write p {
  font-size: 16px;
  padding-top: 8px;
  padding-bottom: 8px;
  margin: 0;
  line-height: 26px;
  color: black;
}

/*  todo item 对齐 */
#write input[type="checkbox"] {
  margin-top: calc(1em - 2px);
  margin-right: 5px;
  left: -3px;
}

/*标题*/
#write h1,
#write h2,
#write h3,
#write h4,
#write h5,
#write h6 {
  margin: .72em 0;
  padding: 0px;
  font-weight: bold;
  color: black;
}
#write h1 {
  margin: 1.2em 0;
  font-size: 2rem;
  /* text-align: center; */
}
#write h2::before{
  content: "✔";
  font-weight: bold;
  color: #ffb11b;
  margin-right: 4px
}
#write h2 {
  font-size: 1.7rem;
  margin: 1em 0;
}
#write h2 span {
 font-weight: bold;
 color: #333;
 padding: 3px 10px 1px;
}

#write h3 {
  font-size: 1.5rem;
}
#write h4 {
  font-size: 1.25rem;
}
#write h5 {
  font-size: 1rem;
}
#write h6 {
  font-size: 1rem;
}

/* 列表 */
#write ul,
#write ol {
  margin-top: 8px;
  margin-bottom: 8px;
  padding-left: 40px;
  color: black;
}
#write ul {
  list-style-type: disc;
}
#write ul ul {
  list-style-type: square;
}
#write ol {
  list-style-type: decimal;
}
/* 列表内容 */
#write li section {
  font-size:15px;
}

/* 字体加粗 */
/* #write strong::before {
  content: '「';
} */

#write strong {
  color: #E49123;
  font-weight: bold;
}

/* #write strong::after {
  content: '」';
} */

/*引用*/
#write blockquote {
  margin-bottom: 16px;
  margin-top: 16px;
  padding: 10px 10px 10px 20px;
  font-size: 0.9em;
  background: #fff9f9;
  border-left: 3px solid #ffb11b;
  color: #6a737d;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}
#write blockquote p {
  line-height: 26px;
}

/* 超链接 */
#write a {
  text-decoration: none;
  font-weight: bold;
  color: #E49123;
  border-bottom: 1px solid #E49123;
}

/* 分割线 */
#write hr {
  height: 1px;
  padding: 0;
  border: none;
  text-align: center;
  background-image: linear-gradient(to right,rgba(231, 93, 109,0.3),rgba(255, 159, 150,0.75),rgba(255, 216, 181,0.3));
}

/* background-color 由 rgba 转为 HEX*/
#write code{
  font-size: 14px;
  color:  rgb(235, 76, 55);
  background-color: #f0f0f0;
}

/* 行内代码 */
#write p code,
#write span code,
#write li code {
  word-wrap: break-word;
  padding: 2px 4px;
  border-radius: 4px;
  margin: 0 2px;
  word-break: break-all;
}

/* 文章插图 */
#write img {
  display: block;
  margin: 0 auto;
  width: 85%;
  max-width: 100%;
  border-radius: 5px;
  box-shadow:0px 4px 12px #84A1A8;
  border: 0px;
}

#write table tr {
  border: 0;
  border-top: 1px solid #ccc;
  background-color: white;
}
#write table tr:nth-child(2n) {
  background-color: #F8F8F8;
}
#write table tr th,
#write table tr td {
  font-size: 16px;
  line-height: 1.5;
  border: 1px solid #ccc;
  padding: 5px 10px;
  text-align: left;
}
#write table tr th {
  font-weight: bold;
  background-color: #f0f0f0;
}


/* 上角标 */
#write .md-footnote {
 font-weight: bold;
 color: #E49123;
}
#write .md-footnote > .md-text:before {
 content: '['
}
#write .md-footnote > .md-text:after {
 content: ']'
}


/* 下角标 */
#write .md-def-name {
  padding-right: 1.8ch;
}
#write .md-def-name:before {
  content: '[';
  color: #000;
}
#write .md-def-name:after {
  color: #000;
}


/* 代码块主题 */
code, .md-fences {
	padding: .5em;
	/* border: 1px solid #ccc; */
	padding: .1em;
	border-radius: 5px;
	margin-left: 0.2em;
  margin-right: 0.2em;
  font-family: "Fira Code", "微软雅黑","PingFang SC", "Microsoft YaHei", sans-serif;
}
.md-fences {
  margin: 0 0 20px;
  background-color: #292b35;
  color: rgb(236, 236, 236);
	/* font-size: 1em; */
	padding: 0.3em 1em;
  padding-top: 0.4em;
  box-shadow: 0px 4px 9px grey;
}
.CodeMirror div.CodeMirror-cursor {
  margin-left: 4.6px;
  border-left: 1px solid #7ba0f0;
  z-index: 5;
}
.cm-s-inner div.CodeMirror-selected {
  background: rgba(113, 124, 180, 0.2);
}
.CodeMirror-code{
  margin-left: 5px;
}
.cm-s-inner .cm-keyword {
  color: #c792ea;
  font-weight: 450;
}
.cm-s-inner .cm-operator {
  color: #89ddff;
}
.cm-s-inner .cm-variable-2 {
  color: #eeffff;
}
.cm-s-inner .cm-variable-3,
.cm-s-inner .cm-type {
  color: #f07178;
}
.cm-s-inner .cm-builtin {
  color: #ffcb6b;
}
.cm-s-inner .cm-atom {
  color: #f78c6c;
}
.cm-s-inner .cm-number {
  color: #ff5370;
}
.cm-s-inner .cm-def {
  color: #82aaff;
}
.cm-s-inner .cm-string {
  color: #c3e88d;
}
.cm-s-inner .cm-string-2 {
  color: #f07178;
}
.cm-s-inner .cm-comment {
  color: #676e95;
}
.cm-s-inner .cm-variable {
  color: #f07178;
}
.cm-s-inner .cm-tag {
  color: #ff5370;
}
.cm-s-inner .cm-meta {
  color: #ffcb6b;
}
.cm-s-inner .cm-attribute {
  color: #c792ea;
}
.cm-s-inner .cm-property {
  color: #c792ea;
}
.cm-s-inner .cm-qualifier {
  color: #decb6b;
}
.cm-s-inner .cm-variable-3,
.cm-s-inner .cm-type {
  color: #decb6b;
}
.cm-s-inner .cm-error {
  color: rgba(255, 255, 255, 1);
  background-color: #e9405c;
}

/*流程图样式*/
pre[lang='sequence'],
pre[lang='flow'],
pre[lang='mermaid']
{
  background: #ffffff;
  color: #333333;
}

 :root {--mermaid-font-zoom:1.25em ;} 
</style><title>git笔记</title>
</head>
<body class='typora-export os-windows'><div class='typora-export-content'>
<div id='write'  class=''><p>&nbsp;</p><div class='md-toc' mdtype='toc'><p class="md-toc-content" role="list"><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n4"><a class="md-toc-inner" href="#一git菜鸟教程">一.git菜鸟教程<span>							</span></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n5"><a class="md-toc-inner" href="#1windows上的安装">1.<strong>Windows上的安装</strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n19"><a class="md-toc-inner" href="#2git的配置">2.<strong>git的配置</strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n43"><a class="md-toc-inner" href="#3git的初始化">3.<strong>git的初始化</strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n58"><a class="md-toc-inner" href="#4git进行提交文件">4.<strong>git进行提交文件</strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n151"><a class="md-toc-inner" href="#5操作失误或者反悔了怎么办">5.<strong>操作失误，或者反悔了怎么办？</strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n198"><a class="md-toc-inner" href="#6git将仓库中的版本回退到工作区">6.<strong>git将仓库中的版本回退到工作区</strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n246"><a class="md-toc-inner" href="#6git里删除文件的操作">6.<strong>git里删除文件的操作 </strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n272"><a class="md-toc-inner" href="#7git的本地分支操作">7.<strong>git的本地分支操作 </strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n309"><a class="md-toc-inner" href="#git远程仓库建立">#<strong>git远程仓库建立  </strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n360"><a class="md-toc-inner" href="#8git的远程分支操作">8.<strong>git的远程分支操作 </strong></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n391"><a class="md-toc-inner" href="#9git标签">9.<strong>git标签</strong> </a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n433"><a class="md-toc-inner" href="#-一些可能出现的状况">### <strong>一些可能出现的状况</strong></a></span></p></div><p>&nbsp;</p><h1 id='一git菜鸟教程'><span>一.git菜鸟教程</span><span>							</span></h1><h3 id='1windows上的安装'><span>1.</span><strong><span>Windows上的安装</span></strong></h3><p><span>	</span><span>下载git（国内镜像）：</span><a href='https://npm.taobao.org/mirrors/git-for-windows/'><span>下载地址</span></a><span>		</span></p><ol start='' ><li><span>选择最新的安装包</span></li><li><span>然后我选择下载64位的（由你的操作系统决定）</span></li><li><span>下载好后，一直下一步（学习的话，默认安装即可）</span></li><li><span>安装完成后，右键点击桌面就会出现和git有关的选项了。</span></li></ol><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='2git的配置'><span>2.</span><strong><span>git的配置</span></strong></h3><ol start='' ><li><span>安装好完成后，我们菜单键+R，然后输入cmd。</span><strong><span>打开命令指示器</span></strong><span>。</span></li><li><span>输入</span><strong><span>git</span></strong><span>或者</span><strong><span>git --version</span></strong><span>，如果没有报错则安装成功。</span></li><li><span>然后我们进行一下全局配置： </span></li></ol><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="windows命令"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="windows命令"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 6.8px; left: 9px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><span><span>​</span>x</span></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">// 这个在团队合作时，能区分是谁进行的git操作，因此很有必要</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">git config --global user.name "你的名字"</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">git config --global user.email "你的邮箱"</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 70px;"></div><div class="CodeMirror-gutters" style="display: none; height: 70px;"></div></div></div></pre><p><span>git专门提供了一个git config的工具，来配置工作环境变量</span></p><p><span>这些环境变量，决定了git在各个环节的具体工作方式和行为。</span></p><!--这些了解就行了，可以选择不看--><ul><li><p><span>/etc/gitconfig 文件：系统中对所有用户都普遍适用的配置。若使用 git     config 时用 --system 选项，读写的就是这个文件。</span></p></li><li><p><span>~/.gitconfig 文件：用户目录下的配置文件只适用于该用户。若使用 git     config 时用 --global 选项，读写的就是这个文件。</span></p></li><li><p><span>当前项目的     Git     目录中的配置文件（也就是工作目录中的 .git/config 文件）：这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置，所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。</span></p><p><span>在 Windows 系统上，Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录，一般都是 C:\Documents and Settings</span><span>$</span><span>USER。</span></p><p><span>此外，Git 还会尝试找寻 /etc/gitconfig 文件，只不过看当初 Git 装在什么目录，就以此作为根目录来定位。</span></p></li><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><p>&nbsp;</p><h3 id='3git的初始化'><span>3.</span><strong><span>git的初始化</span></strong></h3><ol start='' ><li><p><span>git配置好之后，我们现在开始创建一个git来管理我们的项目。</span></p></li><li><p><span>首先，我们打开我们的工作目录。</span></p><p><span>比如现在我有一个py项目，它在E:/myproject</span></p></li><li><p><span>我们打开文件，</span><strong><span>点击右键选择git bash here</span></strong></p></li><li><p><span>输入：</span><strong><span>git init</span></strong><span>，这时我们的文件夹下，会出现一个.git的文件夹。如果你不能看见，你选择在左上角的</span><strong><span>查看（显示/隐藏）</span></strong><span>里</span><strong><span>勾选隐藏的项目</span></strong></p></li></ol><p><span>// 之后我都会一此文件夹，表示我的项目文件夹。</span></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='4git进行提交文件'><span>4.</span><strong><span>git进行提交文件</span></strong></h3><blockquote><p><span>在我们创建工作目录下的文件之前，我们要先了解git的工作原理。</span></p><p><span>git是有三个区域的。</span></p><ol start='' ><li><span>工作区（就是你当前工作的目录）</span></li><li><span>缓存区（我们add的话，首先要传给缓存区）  </span></li><li><span>仓库/历史记录区（仓库里有我们每一次commit的历史记录）</span></li></ol></blockquote><p><img src="https://img-blog.csdn.net/20171115182932946?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTEzNTkwMzk0NDYy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" referrerpolicy="no-referrer" alt="img"></p><p><span>这图就是git的工作基本原理，我们先不用了解上面的操作是什么意思，有一个概念就行了。</span></p><p>&nbsp;</p><ol start='' ><li><p><span>我们依旧是右键打开我们git指示行（git bash here）。</span></p></li><li><p><span>我们可以先输入一条指令：git status，它会显示</span></p><ol start='' ><li><span>on branch master</span></li><li><span>no commits yet</span></li><li><span>nothing to commit （XXX）</span></li></ol></li><li><p><span>它的意思是，现在这个项目里，在你git init 的前后，它没有追踪到有任何发生的变化（文件的增删改）。现在我们举一个生动的例子</span></p><ol start='' ><li><strong><span>我们可以把git当成一个班主任，它无时无刻的都在盯着你这个项目的变化。只要你是在这个项目里的操作，都会被他记录。</span></strong></li><li><strong><span>git的工作区当成一个班级，里面会有学生（文件）增加和删除，和变化</span></strong></li><li><strong><span>git的缓存区就相当于信息处的老师，如果信息处老师的信息和班上不匹配，班主任就会告诉我们，让我们把信息更新到信息处去</span></strong></li><li><strong><span>仓库就是学生信息管理系统，但是这个库不会删除也不会覆盖信息，它既有你更新后的信息，也有你更新前的信息，可以让你反悔</span></strong></li><li><span>但是，</span><strong><span>如果在我们git init 之前，我们就存在一个文件old.txt</span></strong><span>，当我们init后，我们输入git status，他会提示untracked files，并且会标红old.txt,</span></li><li><span>这个时候，就相当于在学校没成立前，就有一个old学生了。我们的库里没有它的信息，所以它需要提交一边自己的信息，这样它才算我们学校的学生</span></li><li><span>我们可以输入以下操作提交它的信息：git add “标红的文件名全称” ， 再输入git commit -m “这是之前的old学生”，我们再输入git status就不会有错误提示拉。</span></li><li><strong><span>7段，我们可以先不用理解，但是对操作要有一个概念，我提交信息有两步，add 与commit</span></strong></li></ol></li><li><p><span>现在，我们处理完git init之前的历史遗留问题后。我们开始我们的项目工作。</span></p><ol start='' ><li><span>这时，我们想创建一个hello.py（你可以是任文件，我只是举一个py的例子）</span></li><li><span>我们写一段 </span><code>print(&quot;这是我第一次使用git&quot;)</code><span>，我们运行一下，没有问题。</span></li><li><span>这个时候git班主任，发现了一个hello.py的学生，它的信息是  </span><code>print(&quot;这是我第一次使用git&quot;)</code><span>。</span></li><li><span>这个时候，我们输入git status，蛤，果然，他会提示我们出现了一个untaracked files。</span></li><li><span>这个时候，我们git老师，首先</span><strong><span>git add “要提交文件的全称”</span></strong><span>，把他的信息交到信息处的老师手里（缓存区），然后再有信息处的老师把学生信息</span><strong><span>git commit -m “你要备注的信息”</span></strong><span> 提交到系统（仓库）里，并且备注好这一次的操作。</span></li><li><span>这样一来，我们的更新信息就完成了。</span></li></ol></li><li><p><span>因此，我们可以总结一下。我们提交的操作。  操作小结</span><strong></strong></p><p><strong><img src="C:\Users\10022\Desktop\md笔记\git\img2.png" referrerpolicy="no-referrer" alt="image-20210504130825992"></strong></p><p><span>																	</span><strong><span>简单明了的图片</span></strong></p><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git 命令</span></th><th style='text-align:center;' ><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>查看当前git的状态</span></td><td style='text-align:center;' ><span>git status</span></td><td style='text-align:center;' ><span>如果你文件变动，没有add和commit，它会提示你，并且给出相应的提示操作</span></td></tr><tr><td style='text-align:center;' ><span>把文件添加到缓存区</span></td><td style='text-align:center;' ><span>git add “要添加的文件全称”</span></td><td style='text-align:center;' ><span>把你变动的文件提交的缓冲区。因为，缓存区的存在你可以多次add，一次commit</span></td></tr><tr><td style='text-align:center;' ><span>把缓存区里的文件进行提交</span></td><td style='text-align:center;' ><span>git commit -m “注释”</span></td><td style='text-align:center;' ><span>把缓存区里的所有文件提交，并作为一个历史版本。方便我们的版本回溯，和上传到远程仓库。</span><strong><span>其中，注释非常重要，它能让你快速的区分你版本的细微差别，前提是你自己写得，你能看懂</span></strong></td></tr><tr><td style='text-align:center;' ><span>#补充一个，合并操作</span></td><td style='text-align:center;' ><span>git commit -a -m “注释”</span></td><td style='text-align:center;' ><span>相当于add与commit的联合操作命令</span></td></tr></tbody></table></figure></li></ol><ul><li><strong><span>1.需要注意的是，我们可以用 git add * ，来提交所有变动的工作区里的文件。</span></strong></li><li><strong><span>2.如果你输入了 git commit 。忘记输入-m “xxx”,git会让你进入一个vim模式，让你写完注释后，才能退出来。再vim里的操作是，按i进入写作模式，然后就能写注释了。esc键退出写作模式，：wq保存退出。</span></strong></li><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><p>&nbsp;</p><h3 id='5操作失误或者反悔了怎么办'><span>5.</span><strong><span>操作失误，或者反悔了怎么办？</span></strong></h3><p><span>比如。1月1号早上，我写了一个py文件，我已经写好了，并且add添加到了缓存区。这个时候，突然老板让我重新改一下程序。可是，我已经传到了缓存区。怎么办呢？</span></p><p><strong><span>git非常的人性化，它能包容我们的失误。换句话说，它可以让我们反悔我的提交。所以，安装一个git，就算我们不用来写一些重大项目，也可以用来备份，防止我们的错误操作</span></strong></p><p><span>1.我们只要没有commit提交成为一个历史版本，我们的就可以撤销的任何操作（增删改）</span></p><p><span>2.但是，我们分为两种状态，已追踪，未追踪。</span></p><ol start='' ><li><span>如果你是新建立的文件，你没有被追踪，缓存区，和仓库都没有你的信息，你被删除了就被删</span><span>	</span><span>  除了，git是无法找回你的信息的。</span><strong><span>未追踪</span></strong></li></ol><p><span>   2.如果你只要被add，或者commit过，那么你的就是</span><strong><span>已追踪</span></strong></p><p><span>   3.但是，已追踪的撤回修改有两种：</span></p><ul><li><strong><span>hello.py完成了修改，但没有add到缓存区中。</span></strong><span>我们缓存区里把老版本的hello.py拿出来，覆盖我们的新hello.py。这样我们就撤销了变动。 </span><strong><span>git checkout &quot;文件名&quot;</span></strong></li><li><strong><span>hello.py完成了修改，并且add到了缓存区。</span></strong><span>这时，我们缓存区里的文件也变了。我们输入</span><strong><span>git restore  &quot;文件名&quot;</span></strong><span>/</span><strong><span>git reset HEAD &quot;文件名&quot;</span></strong><span>，这样撤销我们缓存区里的更新，</span><strong><span>再结合覆盖工作区里的更新</span></strong><span>，我们的撤销就算完成了。</span></li></ul><p><span>如果我想比较一下两个版本再决定，是否撤销的话怎办呢？</span></p><p><span>我们输入：</span><strong><span>git diff HEAD -- &quot;文件名&quot;</span></strong><span> ,git就会输出比较结果了。</span></p><p><span>操作小结：</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git 命令</span></th><th style='text-align:center;' ><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>拉取缓存区里的文件，然后覆盖工作区的文件</span></td><td style='text-align:center;' ><span>git checkout ”文件名“</span></td><td style='text-align:center;' ><span>该操作，会用缓存区里的文件去覆盖，工作区里的文件，也可以理解为撤销工作区变动的操作</span></td></tr><tr><td style='text-align:center;' ><span>撤销缓存区的变化</span></td><td style='text-align:center;' ><span>git restore &quot;文件名&quot;</span></td><td style='text-align:center;' ><span>与下面操作类型，但是这个是确实的撤销操作，而下方的是覆盖操作。</span></td></tr><tr><td style='text-align:center;' ><span>拉取仓库里的文件，然后覆盖缓存区的文件</span></td><td style='text-align:center;' ><span>git reset HEAD ”文件名“</span></td><td style='text-align:center;' ><span>该操作，会用最新一个版本中的文件，去覆盖缓存区里的文件，也可以理解为撤销缓存区里的变动</span></td></tr><tr><td style='text-align:center;' ><span>拉取仓库里的文件，然后覆盖缓存区和工作区的文件</span></td><td style='text-align:center;' ><span>git reset --hard HEAD^</span></td><td style='text-align:center;' ><span>回到上一版本，（工作区，缓存区，和仓库都回到）</span></td></tr><tr><td style='text-align:center;' ><span>比较仓库里</span></td><td style='text-align:center;' ><span>git diff HEAD -- ”文件名“</span></td><td style='text-align:center;' ><span>比较当前版本仓库里的文件，与工作区里文件的区别。并输出他们。（+++代表的是工作区的新文件，---代表的是仓库的老文件）</span></td></tr></tbody></table></figure><p>&nbsp;</p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='6git将仓库中的版本回退到工作区'><span>6.</span><strong><span>git将仓库中的版本回退到工作区</span></strong></h3><ol start='' ><li><span>首先，我们要明确一个概念，git的提交是按照，commit的时间排序的。所有log是以时间排布的</span></li><li><span>我们进行git log查看我们的所有的版本操作</span></li><li><span>然后进行我们的版本回调，最好用git reflog 查看，因为git log 是查看当前版本下，之前的版本，而reflog 是查看所有版本</span></li><li><span>我们回溯到之前版本后，并没有对新版本进行删除，它只是被隐藏了。用reflog还是能看见的</span></li><li><span>所以，注释写的很有必要，不然你就忘记它是干嘛的勒</span></li></ol><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git命令</span></th><th style='text-align:left;' ><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>查看当前版本之前的git commit的提交历史</span></td><td style='text-align:center;' ><strong><span>git log</span></strong></td><td style='text-align:left;' ><span>1.commit：“id”  #唯一的id</span><br><span>2.（HEAD—&gt;master）#提交到master分支 </span><br><span>3.  author #作者信息</span><br><span>4. Date #提交时间</span><br><span>5.“第X次提交” #相当于注释一样，解释改动</span></td></tr><tr><td style='text-align:center;' ><span>1.从当前这个版本，回到某个之前提交过的前一个版本</span></td><td style='text-align:center;' ><strong><span>git reset --hard HEAD^</span></strong></td><td style='text-align:left;' ><span>回到上一个版本</span></td></tr><tr><td style='text-align:center;' ><span>2.从当前这个版本，回到某个之前提交过的前两个版本</span></td><td style='text-align:center;' ><strong><span>git reset --hard HEAD^^</span></strong></td><td style='text-align:left;' ><span>回到上二个版本，类推</span></td></tr><tr><td style='text-align:center;' ><span>3.从当前这个版本，回到某个之前提交过的前N个版本</span></td><td style='text-align:center;' ><strong><span>git reset --hard HEAD~n</span></strong></td><td style='text-align:left;' ><span>回到上N个版本</span></td></tr><tr><td style='text-align:center;' ><span>查看所有的git commit的提交历史</span></td><td style='text-align:center;' ><strong><span>git reflog</span></strong></td><td style='text-align:left;' ><strong><span>同git log</span></strong><span>不过可以查看，你提交过的所以版本</span></td></tr><tr><td style='text-align:center;' ><span>跳到指定的版本</span><br><span>（往前跳，往后跳都行，只是要结合git reflog的id）</span></td><td style='text-align:center;' ><span>git reset --hard “commit-id”</span></td><td style='text-align:left;' ><span>commit-id 是需要我们git reflog 查看的。</span><br><span>#并且没有注释的话，你并不知道那个是你需要的id，所有-m 的注释很有必要写。</span></td></tr><tr><td style='text-align:center;' ><span>git log的一行输出</span></td><td style='text-align:center;' ><strong><span>git log --pretty==oneline</span></strong></td><td style='text-align:left;' ><span>这样我们只会一行输出id和注释</span></td></tr></tbody></table></figure><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='6git里删除文件的操作'><span>6.</span><strong><span>git里删除文件的操作 </span></strong></h3><p><span>在阅读前，首先我们需要明白：</span></p><p><span>	</span><span>1.我们回溯版本并不会导致版本被删除。我们git log 发现不见了只是被隐藏了，我们依然可以 git reflog 来看</span></p><p><span>	</span><span>2.当我们想要删除某一个文件时，删除也可以当成一次修改，并且提交到仓库中，成为一个新的版本</span></p><p><span>所以，我们要清楚的意识到删除也是一个改变。</span></p><p><span>因此，我们删除也有两种方法：</span></p><p><span>1.第一种：</span></p><p><span>	</span><span>1.我们在工作区中，删掉我们要删除的文件。</span></p><p><span>	</span><span>2.然后我们add 删掉文件的名称</span><strong><span>（为什么被删掉了，我们还要add了。你可以理解为告诉git，我在工作区删掉它了，</span><span>		</span><span>你缓存区也要删掉它）</span></strong><span>，</span></p><p><span>	</span><span>3.然后我们再commit，</span><strong><span>（我们就生成了一个新的版本，没有包含我们删除文件的版本，但是之前的版本依旧被保留</span><span>		</span><span>不会被覆盖）</span></strong></p><p><span>2.第二种：</span></p><p><span>	</span><span>1.我们直接git rm &quot;要删除文件的名称&quot;  ，</span><strong><span>这时我们本地文件，包括缓存区里的文件都被删除了。</span></strong></p><p><span>	</span><span>#我们如果输入git status，可以看到git再询问我们是否反悔，我们跟着提示，就能取消操作。当我们commit后，就不</span><span>	</span><span>能反悔了。</span></p><p><span>	</span><span>2.我们再commit 一次，我们就生成了一个删除文件的新版本了，</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git命令</span></th><th style='text-align:center;' ><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>删除当前版本中的某个文件</span></td><td style='text-align:center;' ><span>git rm &quot;要删除文件的名称&quot;</span></td><td style='text-align:center;' ><span>我们rm后，它不会产生新的版本，而且本地文件也同时被删除，但是查看状态会提示。如果你要撤回rm可以根据提示操作，如果你要确定删除，你就需要直接commit ，产生一个新的版本。</span></td></tr></tbody></table></figure><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='7git的本地分支操作'><span>7.</span><strong><span>git的本地分支操作 </span></strong></h3><p><span>1.git的分支操作，可以更好用来分布式开发。</span></p><p><span>2.分支不会影响master主干，且分支初始文件是由master当前决定的，是master的拷贝版（分支会继承master的文件，及其log记录）</span></p><p><img src="C:\Users\10022\Desktop\md笔记\git\img3.png" referrerpolicy="no-referrer" alt="image-20210504144941277"></p><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git命令</span></th><th style='text-align:left;' ><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>查看本地的所有分支</span></td><td style='text-align:center;' ><span>git branch</span></td><td style='text-align:left;' ><span>会输出当前所有的本地仓库，带*说明是当前的分支</span></td></tr><tr><td style='text-align:center;' ><span>创建一个新的分支</span></td><td style='text-align:center;' ><span>git checkout -b “分支名称”</span></td><td style='text-align:left;' ><span>会创建一个新的本地分支，并切换到该分支下，分支的内容是master的拷贝版，但修改分支不会影响maser</span></td></tr><tr><td style='text-align:center;' ><span>在分支间切换</span></td><td style='text-align:center;' ><span>git checkout “分支名称”</span></td><td style='text-align:left;' ><span>马上切换到你指定的分支，文件夹里的内容也随着分支改变。</span></td></tr><tr><td style='text-align:center;' ><span>分支的重命名</span></td><td style='text-align:center;' ><span>git branch -m “老名字” “新名字”</span></td><td style='text-align:left;' ><span>分支的名字就被改变了</span></td></tr><tr><td style='text-align:center;' ><span>将分支合并到主干上</span></td><td style='text-align:center;' ><span>git merge “分支名称”</span></td><td style='text-align:left;' ><strong><span>#前提，分支一定要经过测试确定再合并到主干上去。</span></strong><br><strong><span>#而且，合并一定要发生在master上，不能在分支上进行合并</span></strong><br><span>把你所指定的分支与主干合并。并且会输出，提示进行了那些改动。</span><br><span>如果文件内容有差别，他可能会以</span><strong><span>图1</span></strong><span>的样子进行改动。</span><br><strong><span>因此，我们合并完成后，我们要git status一下，看看那些发生了。然后我们去删去我们不需要的代码，然后add，和commit一下就行了</span></strong></td></tr><tr><td style='text-align:center;' ><span>删除分支</span></td><td style='text-align:center;' ><span>git branch -d “分支名称”</span></td><td style='text-align:left;' ><span>会删除你指定的分支</span></td></tr></tbody></table></figure><p><span> </span><strong><span>关于，分支合并产生的冲突，我们手动删除我们不要的部分后，再重新add和commit一次就行了。</span></strong></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='git远程仓库建立'><span>#</span><strong><span>git远程仓库建立  </span></strong></h3><p><span>远程仓库也是git的精髓，它能让你多人合作开发，也能让你看看别人好的代码。</span></p><p><span>1.</span><a href='https://github.com/'><span>GitHub</span></a><span>  目前世界上最大同性交友网站（非常好用，可惜在国外，访问有些慢）</span></p><p><span>2.</span><a href='https://gitee.com/'><span>码云</span></a><span> 国内的开源网站 （建议使用，而且好像有GitHub的镜像）</span></p><p><span>远程仓库的搭建（码云，GitHub创建远程仓库的方法一样。码云稳定一定，所以我用码云做示范）：</span></p><ol start='' ><li><p><span>进入gitee（码云）注册一个账号，然后登陆 /GitHub同理</span></p></li><li><p><span>点击页面右上角的➕符号，点击新建仓库。</span></p></li><li><p><span>后依次的填好你的。仓库名，仓库介绍，选择开源等等</span></p><p><span>由于我们是学习，填好仓库名称即可，其他的日后有需要进行选择。</span></p></li><li><p><span>然后它会出现一个仓库的初始化操作：</span></p><ol start='' ><li><span>我们选择我们的工作目录，我们进入该目录的命令指示行cmd</span></li><li><span>mkdir “仓库名称”  #创建一个目录</span></li><li><span>cd “仓库名称” #进入你创建的目录</span></li><li><span>git init 初始化本地仓库 #把这个目录git初始化</span></li><li><span>git add README.md git commit -m &quot;first commit&quot;  #我们先完成一次提交，README.md没有任何意义，</span></li><li><span>git remote add origin XXX </span><strong><span>#XXX表示的是它给你的仓库地址。origin是你给这个仓库取的别名，之后的操作都需要这个别名。 这个第6步，非常重要，它把你这个工作目录和远程仓库绑定在了一起，并给这个仓库取了个别名origin</span></strong></li><li><span>git push -u origin master #完成一次推送，把你仓库当前版本的内容，推送到你远程仓库的master分支。</span></li></ol><p><span>操作小结：</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git命令</span></th><th style='text-align:left;' ><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>在本地添加一个远程仓库，并给远程仓库取别名（一般为origin）</span></td><td style='text-align:center;' ><span>git remote add “仓库别名（一般都是origin）” &quot;仓库地址&quot;</span></td><td style='text-align:left;' ><span>由于每个人项目的仓库地址不同，所有我们根的地址也不同，且一般别名都是origin</span></td></tr><tr><td style='text-align:center;' ><span>如果我们无法进行远程仓库的连接，我们可以先删除，然后重新连接</span></td><td style='text-align:center;' ><span>git remote rm </span><strong><span>origin</span></strong><span>（别名）</span></td><td style='text-align:left;' ><span>删除连接与远程仓库的连接</span></td></tr><tr><td style='text-align:center;' ><span>把本地的master仓库，推送到远程仓库上面去</span></td><td style='text-align:center;' ><span>git push -u origin master</span></td><td style='text-align:left;' ><span>把我们本地的master代码推到远程仓库的master分支上</span></td></tr></tbody></table></figure><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul></li></ol><h3 id='8git的远程分支操作'><span>8.</span><strong><span>git的远程分支操作 </span></strong></h3><p><span>1.git的远程分支操作，把本地内容，传给远程仓库。（默认都是当前分支，或对当前分支操作）</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git命令</span></th><th style='text-align:left;' ><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>查看远程分支</span></td><td style='text-align:center;' ><span>git branch -a</span></td><td style='text-align:left;' ><span>其中remotes/origin/master 显示的是远程的分支</span></td></tr><tr><td style='text-align:center;' ><span>拉取远程分支到本地</span></td><td style='text-align:center;' ><span>git pull origin &quot;</span><strong><span>要拉取的远程分支的名称</span></strong><span>&quot;</span></td><td style='text-align:left;' >&nbsp;</td></tr><tr><td style='text-align:center;' ><span>推送本地分支到远程</span></td><td style='text-align:center;' ><span>git push origin </span><strong><span>&quot;要推送到远程的本地分支名称&quot;</span></strong></td><td style='text-align:left;' ><span>完成后，网站上会显示出现了新的分支</span></td></tr><tr><td style='text-align:center;' ><span>从远程分支拉取到本地</span></td><td style='text-align:center;' ><span>git checkout -b </span><strong><u><span>&quot;本地分支名称&quot;</span></u></strong><span> </span><strong><u><span>origin/远程分支名字</span></u></strong></td><td style='text-align:left;' ><span>完成后，网上的分支就被拉到本地了</span></td></tr><tr><td style='text-align:center;' ><span>删除远程分支</span></td><td style='text-align:center;' ><span>git push origin </span><strong><span>:&quot;远程分支名字&quot;</span></strong></td><td style='text-align:left;' ><span>完成，网上分支就被删除了</span></td></tr></tbody></table></figure><p><span>#我们有时候直接push，有可能是推送不上去的，因为会存在冲突，所以我们应该先pull拉取一下，然后在本地解决好冲突再上传。</span></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='9git标签'><span>9.</span><strong><span>git标签</span></strong><span> </span></h3><p><span>1.标签就相当于一个版本号，和分支无关。</span></p><p><span>2.一个版本可能有多个分支</span></p><p><span>操作小结：</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>操作描述</span></th><th style='text-align:center;' ><span>git命令</span></th><th><span>输出解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>查看所有标签</span></td><td style='text-align:center;' ><span>git tag</span></td><td><span>查看本地的所有标签</span></td></tr><tr><td style='text-align:center;' ><span>创建标签</span></td><td style='text-align:center;' ><span>git tag “你的标签名称”</span></td><td><span>创一个新标签，在当前仓库的基础上</span></td></tr><tr><td style='text-align:center;' ><span>把单个本地标签推送到全程</span></td><td style='text-align:center;' ><span>git push origin “要推送的标签名称</span></td><td><span>这是单个推送方式</span></td></tr><tr><td style='text-align:center;' ><span>把所有本地标签推送到全程</span></td><td style='text-align:center;' ><span>git push origin --tags</span></td><td><span>这时全部推送</span></td></tr><tr><td style='text-align:center;' ><span>删除本地标签</span></td><td style='text-align:center;' ><span>git tag -d “要删除的标签名”</span></td><td><span>删除本地标签</span></td></tr><tr><td style='text-align:center;' ><span>删除远程标签</span></td><td style='text-align:center;' ><span>git push origin ：refs/tags/“要删除的远程标签名”</span></td><td><span>删除远程标签</span></td></tr></tbody></table></figure><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' /><p><span>本章完成</span></p></li></ul><h3 id='-一些可能出现的状况'><span>### </span><strong><span>一些可能出现的状况</span></strong></h3><p><span>我们在提交代码时，要严格遵循一些规则：</span></p><p><span>	</span><span>1.更新代码到本地：</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>git命令</span></th><th style='text-align:center;' ><span>解释</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>  git  fetch origin master:temp  </span></td><td style='text-align:center;' ><span>  1.从远程仓库的master分支下载到本地，并给他重命名为temp作为一个新分支  </span></td></tr><tr><td style='text-align:center;' ><span> git  diff temp   </span></td><td style='text-align:center;' ><span>2.  // 首先，你得处于master分支，然后再比较master与temp的区别  </span></td></tr><tr><td style='text-align:center;' ><span>  git  merge temp  </span></td><td style='text-align:center;' ><span>3.  //合并temp分支到当前分支  </span></td></tr><tr><td style='text-align:center;' ><span>git  branch -b  </span></td><td style='text-align:center;' ><span>4.  // 合并好后，删除我们不用的分支  </span></td></tr></tbody></table></figure><p><span>	</span><span>思路就是：</span><strong><span>拉取远程代码，作为本地的一个新建分支。进行调整，确认没有bug后，我们切换到maser上，在master上合并我们在本地调整好的temp分支，最好temp没有用了，删掉即可。</span></strong></p><p><span>	</span><span>2.然后 git push origin &lt;远程分支&gt; ，把当前分支上的内容推送到远程分支。</span></p></div></div>
</body>
</html>